package metier;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Stage implements Serializable {

	private static final long serialVersionUID = 5763282457072999087L;

	private int idStage = -1;
	private Entreprise entreprise = null;
	private Departement departement = null;
	private Date validationDepartement = null;
	private String intitule;
	private String description;
	private String lieu;
	private Date debut = null;
	private Date fin = null;
	private Set<Candidature> listeCandidatures = new HashSet<Candidature>();
	
	private void testerExceptionIntitule(String intitule)
			throws Exception {
		if ((intitule==null) || intitule.equals(""))
			throw new Exception("Intitulé ["+intitule+"] incorrect");
	}
	
	private void testerExceptionDescription(String description)
			throws Exception {
		if ((description==null) || description.equals(""))
			throw new Exception("Description ["+description+"] incorrect");
	}
	
	private void testerExceptionLieu(String lieu)
			throws Exception {
		if ((lieu==null) || lieu.equals(""))
			throw new Exception("Lieu ["+lieu+"] incorrect");
	}
	
	private void testerExceptionEntreprise(Entreprise entreprise)
			throws Exception {
		if (entreprise == null)
			throw new Exception("L'entreprise ne doit pas être null");
	}
	
	private void testerExceptionDepartement(Departement departement)
			throws Exception {
		if (departement == null)
			throw new Exception("Le département ne doit pas être null");
	}
	
	private void testerExceptionDebut(Date debut)
			throws Exception {
		if (debut == null)
			throw new Exception("La date de début ne doit pas être null");
	}
	
	private void testerExceptionFin(Date fin)
			throws Exception {
		if (fin == null)
			throw new Exception("La date de fin ne doit pas être null");
	}

	public Stage(int idStage, Entreprise entreprise, Departement departement, String intitule, String description, String lieu, Date debut, Date fin) throws Exception {
		
		super();
		
		testerExceptionIntitule(intitule);
		testerExceptionDescription(description);
		testerExceptionLieu(lieu);
		testerExceptionEntreprise(entreprise);
		testerExceptionDepartement(departement);
		testerExceptionDebut(debut);
		testerExceptionFin(fin);
		
		this.idStage = idStage;	
		this.intitule = intitule;
		this.description = description;
		this.lieu = lieu;
		this.departement = departement;
		this.entreprise = entreprise;
		this.debut = debut;
		this.fin = fin;			
		
	}
	
	public Stage(Entreprise entreprise, Departement departement, String intitule, String description, String lieu, Date debut, Date fin) throws Exception {
			
		testerExceptionIntitule(intitule);
		testerExceptionDescription(description);
		testerExceptionLieu(lieu);
		testerExceptionEntreprise(entreprise);
		testerExceptionDepartement(departement);
		testerExceptionDebut(debut);
		testerExceptionFin(fin);
		
		this.intitule = intitule;
		this.description = description;
		this.lieu = lieu;
		this.departement = departement;
		this.entreprise = entreprise;
		this.debut = debut;
		this.fin = fin;		
		
	}

	/**
	 * Bien qu'illogique avec le mod�le UML, ce constructeur est obligatoire pour respecter la convention
	 * des JavaBean utilisŽe par certains frameworks (Struts, Hibernate, ...)
	 */
	public Stage()
	{		
		this.description = "Neant";
		this.lieu = "Neant";
		this.intitule = "Neant";
	}

	public int getStatus()
	{
		//3: candidature validée(il n'y aura que une candidature)
		if(this.listeCandidatures.size()==1)
			for(Candidature mCandidature: this.listeCandidatures)
				if(mCandidature.getValidationEtudiant()!=null)
					return 3;
		
		//2: validé par le département
		else if(this.validationDepartement != null)
			return 2;
		
		//1: en attente de validation du département
		return 1;
	}
	
	public void setStatus(int status)
	{}
	
	public int getIdStage() {
		return idStage;
	}

	public void setIdStage(int idStage) {
		this.idStage = idStage;
	}

	public Entreprise getEntreprise() {
		return entreprise;
	}

	public void setEntreprise(Entreprise entreprise) {
		this.entreprise = entreprise;
	}

	public Departement getDepartement() {
		return departement;
	}

	public void setDepartement(Departement departement) {
		this.departement = departement;
	}

	public Date getValidationDepartement() {
		return validationDepartement;
	}

	public void setValidationDepartement(Date validationDepartement) {
		this.validationDepartement = validationDepartement;
	}

	public String getIntitule() {
		return intitule;
	}

	public void setIntitule(String intitule) {
		this.intitule = intitule;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getLieu() {
		return lieu;
	}

	public void setLieu(String lieu) {
		this.lieu = lieu;
	}

	public Date getDebut() {
		return debut;
	}

	public void setDebut(Date debut) {
		this.debut = debut;
	}

	public Date getFin() {
		return fin;
	}

	public void setFin(Date fin) {
		this.fin = fin;
	}

	public Set<Candidature> getListeCandidatures() {
		return listeCandidatures;
	}

	public void setListeCandidatures(Set<Candidature> listeCandidatures) {
		this.listeCandidatures = listeCandidatures;
	}
	
	public void addCandidature(Candidature candidature) {
		this.listeCandidatures.add(candidature);
	}
	
	public int nbCandidatures () {
		return this.listeCandidatures.size();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((debut == null) ? 0 : debut.hashCode());
		//result = prime * result
			//	+ ((departement == null) ? 0 : departement.hashCode());
		result = prime * result
				+ ((description == null) ? 0 : description.hashCode());
		result = prime * result
				+ ((entreprise == null) ? 0 : entreprise.hashCode());
		result = prime * result + ((fin == null) ? 0 : fin.hashCode());
		result = prime * result + idStage;
		result = prime * result
				+ ((intitule == null) ? 0 : intitule.hashCode());
		result = prime * result + ((lieu == null) ? 0 : lieu.hashCode());
		result = prime
				* result
				+ ((listeCandidatures == null) ? 0 : listeCandidatures
						.hashCode());
		result = prime
				* result
				+ ((validationDepartement == null) ? 0 : validationDepartement
						.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		
		//Nécessaire pour comparer les dates sans tenir compte des heures
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Stage other = (Stage) obj;
		if (debut == null) {
			if (other.debut != null)
				return false;
		} else if (!dateFormat.format(debut).equals(dateFormat.format(other.debut)))
			return false;
		if (departement == null) {
			if (other.departement != null)
				return false;
		} else if (!departement.equals(other.departement))
			return false;
		if (description == null) {
			if (other.description != null)
				return false;
		} else if (!description.equals(other.description))
			return false;
		if (entreprise == null) {
			if (other.entreprise != null)
				return false;
		} else if (!entreprise.equals(other.entreprise))
			return false;
		if (fin == null) {
			if (other.fin != null)
				return false;
		} else if (!dateFormat.format(fin).equals(dateFormat.format(other.fin)))
			return false;
		if (idStage != other.idStage)
			return false;
		if (intitule == null) {
			if (other.intitule != null)
				return false;
		} else if (!intitule.equals(other.intitule))
			return false;
		if (lieu == null) {
			if (other.lieu != null)
				return false;
		} else if (!lieu.equals(other.lieu))
			return false;
		
		// modification de la fonction equals car appel rŽcursif croisŽ! 
		
		if (validationDepartement == null) {
			if (other.validationDepartement != null)
				return false;
		} else if (!dateFormat.format(validationDepartement).equals(dateFormat.format(other.validationDepartement)))
			return false;
		return true;
	}
	
	
}
